package com.tanhua.dubbo.server.service;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

//生成自增长的id，原理：使用redis的自增长值
@Service
public class IdService {


    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 生成自增长pid
     * @param type    动态
     * @param strId   动态id
     * @return
     */
    public Long createId(String type, String strId) {
        type = StringUtils.upperCase(type);

        String idHashKey = "TANHUA_ID_HASH_" + type;
        if (this.redisTemplate.opsForHash().hasKey(idHashKey, strId)) {
            return Long.valueOf(this.redisTemplate.opsForHash().get(idHashKey, strId).toString());
        }

        String idKey = "TANHUA_ID_" + type;
        Long id = this.redisTemplate.opsForValue().increment(idKey);

        this.redisTemplate.opsForHash().put(idHashKey, strId, id.toString());

        return id;
    }
    public Long getAutoIncrementId(String type, String objectId) {

        type = StringUtils.upperCase(type);     //将功能名称转换成大写

        // 每一个hashKey的值（HashMap）中都保存着对应功能里的所有已经存在的objectId和自增长id的对应关系，
        // 格式为（TANHUA_HASH_ID_具体功能 objectId:自增长id）
        String hashKey = "TANHUA_HASH_ID_" + type;

        //把hashKey作为redisKey，objectId作为hashMap中的键，查询是否有对应的值
        if (redisTemplate.opsForHash().hasKey(hashKey, objectId)) {
            //有对应的值，直接返回
            return Long.valueOf(redisTemplate.opsForHash().get(hashKey, objectId).toString());
        }

        //当前的objectId没有对应的自增长id，获取一个新的
        //功能不同，自增长的值也不同，每一个功能对应的键为 （TANHUA_ID_具体功能 自增长id）
        String key = "TANHUA_ID_" + type;
        Long id = redisTemplate.opsForValue().increment(key);

        //把新生成的自增长id与objectId生成对应关系，保存
        redisTemplate.opsForHash().put(hashKey,objectId,id.toString());

        return id;  //返回与输入objectId对应的自增长的id
    }

}